#===============================================================================
# Koro Business Environment
# Copyright (C) 2008  Antonio Corroppoli
#
#This file is part of Koro BE.
# 
# Koro BE is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# 
# Koro BE is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with Koro BE; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
#===============================================================================

'''
Created on 09/ago/2011

@author: antstud
'''

import wx
from koro.ui.wxgui.widgets import controls as co,dialogs
from koro.ui.wxgui.panels import BasePanel
from koro.modules import lookup

EVT_FORNITORE_EDIT=wx.PyEventBinder(wx.NewEventType(),1)
EVT_FORNITORE_ADD=wx.PyEventBinder(wx.NewEventType(),1)
EVT_FORNITORE_REMOVE=wx.PyEventBinder(wx.NewEventType(),1)
EVT_PREZZO_EDIT=wx.PyEventBinder(wx.NewEventType(),1)

#===============================================================================
# InfoFornitorePanel
#===============================================================================
class InfoFornitorePanel(BasePanel):
    def __init__(self,*args,**kwargs):
        BasePanel.__init__(self,*args,**kwargs)
        self.SetClientSize((430,250))
        self._layout()
    
    def _layout(self):
        hsizer=wx.BoxSizer()
        sizer=wx.BoxSizer(wx.VERTICAL)
        
        sizer.AddSpacer((1,5))
        
        self.fornitore=co.LabelLookupCtrl(self,label='Fornitore',size=(300,-1),view='ragione_sociale')
        self.fornitore.set_lookup_context(lookup.LOOKUP_FORNITORI)
        sizer.Add(self.fornitore,0,wx.ALL,border=1)
        
        sizer.AddSpacer((1,20))
        
        self.cod_prod_forn=co.LabelTextCtrl(self,label='Cod.Prod.Forn.',size=(300,-1))
        sizer.Add(self.cod_prod_forn,0,wx.ALL,border=1)
        
        self.prezzo_fornitore=co.KValutaCtrl(self,label='Prezzo Forn.',size=(300,-1))
        sizer.Add(self.prezzo_fornitore,0,wx.ALL,border=1)
        
        sizer.AddSpacer((1,20))
        
        self.fornitore_principale=wx.CheckBox(self,label='Fornitore Principale')
        sizer.Add(self.fornitore_principale,0,wx.ALL,border=1)
        
        hsizer.Add(sizer,0,wx.ALL,border=5)
        
        self.SetSizer(hsizer)
    
    def update_fields(self,obj):
        if obj.principale:
            self.fornitore_principale.Enable(False)
        self.fornitore.set_value(obj.fornitore)
        self.cod_prod_forn.set_value(obj.codice_prod_forn)
        self.prezzo_fornitore.set_value(obj.prezzo_fornitore)
        self.fornitore_principale.SetValue(obj.principale)
    
    def update_object(self,obj):
        obj.set_info_fornitore(self.fornitore.get_selected_object(),
                     self.cod_prod_forn.get_value(),
                     self.prezzo_fornitore.get_value(),
                     self.fornitore_principale.GetValue()
                     )
#        obj.set_fornitore(self.fornitore.get_selected_object())
#        obj.codice_prod_forn=self.cod_prod_forn.get_value()
#        obj.set_principale(self.fornitore_principale.GetValue())#deve stare prima di set_prezzo_fornitore per far scattare l'aggiornamento prezzi
#        obj.set_prezzo_fornitore(self.prezzo_fornitore.get_value())
        


#===============================================================================
# FormulaPrezzoPanel
#===============================================================================
class PrezzoPanel(BasePanel):
    '''Permette di modificare il prezzo impostando una formula o inserendolo manualmente.
    Lavora con un oggetto di tipo PrezzoProdotto.'''
    def __init__(self,*args,**kwargs):
        BasePanel.__init__(self,*args,**kwargs)
        self.SetClientSize((450,320))
        self.radio_manuale=wx.RadioButton(self,label='Manuale',style=wx.RB_GROUP)
        #self.prezzo=co.LabelTextCtrl(self,label='Prezzo',valuta=True)
        self.prezzo=co.KValutaCtrl(self,label='Prezzo')
        self.radio_formula=wx.RadioButton(self,label='Formula')
        self.listino=co.ListinoCtrl(self)
#        self.ricarico=co.LabelTextCtrl(self,label='Ricarico',valuta=True)
#        self.importo_fisso=co.LabelTextCtrl(self,label='Importo Fisso',valuta=True)
        self.ricarico=co.KPercentoCtrl(self,label='Ricarico')
        self.importo_fisso=co.KValutaCtrl(self,label='Importo Fisso')
        
        self.__do_layout()
        self.__bind()
        self._update_fields_state()
    
    def __do_layout(self):
        sizer=wx.GridBagSizer(6,1)      
        
        font=self.radio_formula.GetFont()
        font.SetWeight(wx.FONTWEIGHT_BOLD)
        self.radio_formula.SetFont(font)
        font=self.radio_manuale.GetFont()
        font.SetWeight(wx.FONTWEIGHT_BOLD)
        self.radio_manuale.SetFont(font)
    
        sizer.Add(self.radio_manuale,(0,0))
        sizer.Add(self.prezzo,(1,0),flag=wx.LEFT,border=20)
        sizer.Add(self.radio_formula,(2,0),flag=wx.TOP,border=20)
        sizer.Add(self.listino,(3,0),flag=wx.LEFT,border=20)
        sizer.Add(self.ricarico,(4,0),flag=wx.LEFT,border=20)
        sizer.Add(self.importo_fisso,(5,0),flag=wx.LEFT,border=20)
        self.Sizer.Add(sizer,0,wx.ALL,border=10)
    
    def __bind(self):
        self.Bind(wx.EVT_RADIOBUTTON, self._radiobutton_handler, self.radio_formula)
        self.Bind(wx.EVT_RADIOBUTTON, self._radiobutton_handler, self.radio_manuale)
    
    def _radiobutton_handler(self,evt):
        self._update_fields_state()
    
    def _update_fields_state(self):        
        enable=self.radio_formula.GetValue()
        self.Freeze()
        self.prezzo.enable(not enable)
        self.listino.enable(enable)
        self.ricarico.enable(enable)
        self.importo_fisso.enable(enable)
        self.Thaw()
    
    def update_fields(self,obj):
        self.radio_formula.SetValue(obj.has_formula())
        self.radio_manuale.SetValue(not obj.has_formula())
        self._update_fields_state()
        self.reset_fields()
        self.prezzo.set_value(obj.prezzo)
        if obj.has_formula():
            self.listino.set_value(obj.get_listino_formula())
            self.ricarico.set_value(obj.get_ricarico_formula())
            self.importo_fisso.set_value(obj.get_importo_fisso_formula())
    
    def update_object(self,obj):
        if self.radio_formula.GetValue():
            obj.set_formula(self.listino.get_selected_object(),
                            self.ricarico.get_value(),
                            self.importo_fisso.get_value())
        else:
            obj.del_formula()
            obj.set_prezzo(self.prezzo.get_value())
    
    def reset_fields(self):
        self.prezzo.clear()
        self.listino.clear()
        self.ricarico.clear()
        self.importo_fisso.clear()
        
        
#===============================================================================
# ProdottoPanel
#===============================================================================
class ProdottoPanel(BasePanel):
    def __init__(self,*args,**kwargs):
        BasePanel.__init__(self,*args,**kwargs)
        self.ID = co.LabelTextCtrl(self,label='ID',size=(100,-1),mstyle=co.mTE_READ_ONLY)
        self.barcode = co.LabelTextCtrl(self,label='Codice a Barre',size=(170,-1))
        self.categoria = co.LabelObjectChoice(self,label='Categoria',size=(250, 25),view='nome',allow_null=True)
        self.sottocategoria = co.LabelObjectChoice(self,label='Sottocategoria',size=(250, 25),view='nome',allow_null=True)
        self.descrizione = co.LabelTextCtrl(self,label='Descrizione',size=(520, 50),mstyle=co.mTE_TITLED,orientation=wx.VERTICAL,style=wx.TE_MULTILINE)
        self.con_magazzino=wx.CheckBox(self,label='Articolo con magazzino')
        self.add_fornitore_btn=wx.Button(self,label='Aggiungi Fornitore',style=wx.NO_BORDER)
        self.rem_fornitore_btn=wx.Button(self,label='Rimuovi Fornitore',style=wx.NO_BORDER)
        self.lista_fornitori_manager=co.KoroListCtrlManager()
        self.lista_fornitori_manager.set_managed_list(co.KoroListCtrl(self,size=(520,115)))
        self.lista_prezzi_manager=co.KoroListCtrlManager()
        self.lista_prezzi_manager.set_managed_list(co.KoroListCtrl(self,size=(520,200)))
        
        self._fill_categorie()
        self._fill_sottocategorie(None)
        self.__do_layout()
        self.__bind()
        self.SetAutoLayout(True)
    
    def __do_layout(self):
        self.SetSizer(wx.BoxSizer(wx.HORIZONTAL))
        sizer=wx.BoxSizer(wx.VERTICAL)
        
        hsizer = wx.BoxSizer()
        hsizer.Add(self.ID,0)
        hsizer.Add(self.barcode,0,wx.LEFT, border = 10)
        sizer.Add(hsizer,0,wx.ALL,border=1)
        sizer.Add(self.categoria,0,wx.ALL,border=1)
        sizer.Add(self.sottocategoria,0,wx.ALL,border=1)
        sizer.AddSpacer((1,5))
        sizer.Add(self.descrizione,0,wx.ALL,border=1)
        sizer.Add(self.con_magazzino,0,wx.ALL,border=1)
        sizer.Add((1,10),0,wx.EXPAND)
        
        #fornitori prodotto
        hsizer=wx.BoxSizer(wx.HORIZONTAL)
        
        hsizer.Add(self.add_fornitore_btn,0)
        hsizer.Add(wx.StaticLine(self,style=wx.LI_VERTICAL),1,wx.LEFT|wx.RIGHT|wx.EXPAND,border=2)
        hsizer.Add(self.rem_fornitore_btn,0)
        
        self.lista_fornitori_manager.set_columns(columns_info=(co.Column('Fornitore',200,'get_fornitore_fmt'),
                                                               co.Column('Cod. Prod. Forn.',180,'codice_prod_forn'),
                                                               co.Column('Prezzo Forn.',100,'get_prezzo_fornitore_fmt',wx.LIST_FORMAT_RIGHT),
                                                               co.Column(' ',20,'principale_fmt',wx.LIST_FORMAT_CENTER)
                                                               ))
        sizer.Add(hsizer,0)
        sizer.Add(self.lista_fornitori_manager.get_managed_list(),0,wx.EXPAND)
        
        sizer.AddSpacer((1,10))
        
        self.lista_prezzi_manager.set_columns(columns_info=(co.Column('Listino',180,('listino','nome')),
                                                            co.Column('Prezzo',80,'prezzo_fmt',wx.LIST_FORMAT_RIGHT),
                                                            co.Column('Formula',240,'formula_fmt'),
                                                            ))
        sizer.Add(self.lista_prezzi_manager.get_managed_list(),0,wx.ALL,border=1)
        
        self.Sizer.Add(sizer,0,wx.EXPAND|wx.ALL,border=5)
    
    def __bind(self):
        self.lista_fornitori_manager.get_managed_list().Bind(wx.EVT_LIST_ITEM_ACTIVATED,#TODO:cambiare col sistema callback 
                                                             self.edit_fornitore_handler)
        self.lista_prezzi_manager.get_managed_list().Bind(wx.EVT_LIST_ITEM_ACTIVATED,
                                                          self.edit_prezzo_handler)
        self.Bind(wx.EVT_BUTTON, self.add_fornitore_handler, self.add_fornitore_btn)
        self.Bind(wx.EVT_BUTTON, self.rem_fornitore_handler, self.rem_fornitore_btn)
        self.categoria.Bind(wx.EVT_CHOICE, self._fill_sottocategorie)
    
    def _fill_sottocategorie(self,evt):
        self.sottocategoria.clear()
        obj=self.categoria.get_selected_object()
        if obj is None:
            self.sottocategoria.load([])
            return
        observer=wx.GetApp().get_observer()
        observer.set_context('CATEG_PRODOTTI')
        self.sottocategoria.load(observer.get_sottocategorie(obj))
    
    def _fill_categorie(self):
        observer=wx.GetApp().get_observer()
        observer.set_context('CATEG_PRODOTTI')
        self.categoria.load(observer.get_objects())
    
    def add_fornitore_handler(self,evt):
        dlg=lookup.LOOKUP_FORNITORI(wx.GetApp().GetTopWindow(),filter=None)
        #action=dlg.ShowModal()
        action=dlg.show()
        if action==wx.ID_CANCEL:
            dlg.Destroy()
            return
        fornitore=dlg.get_selection()
        dlg.Destroy()
        evento=wx.PyCommandEvent(EVT_FORNITORE_ADD.typeId,self.GetId())
        evento.fornitore=fornitore
        self.GetEventHandler().ProcessEvent(evento)
            
    def rem_fornitore_handler(self,evt):
        info_fornitore=self.lista_fornitori_manager.get_selected_object()
        if info_fornitore is None:
            wx.GetApp().show_message('Selezionare il fornitore da rimuovere.')
            return
        question="Rimuovere dal prodotto il fornitore \n'{0}'?"
        question=question.format(info_fornitore.fornitore.ragione_sociale)
        response=wx.GetApp().show_question(question)
        if response==wx.ID_NO:
            return
        evento=wx.PyCommandEvent(EVT_FORNITORE_REMOVE.typeId,self.GetId())        
        evento.info_fornitore=info_fornitore
        self.GetEventHandler().ProcessEvent(evento)
    
    def edit_fornitore_handler(self,evt):
        evento=wx.PyCommandEvent(EVT_FORNITORE_EDIT.typeId,self.GetId())        
        evento.info_fornitore=self.lista_fornitori_manager.get_selected_object()
        self.GetEventHandler().ProcessEvent(evento)
    
    def edit_prezzo_handler(self,evt):
        evento=wx.PyCommandEvent(EVT_PREZZO_EDIT.typeId,self.GetId())
        evento.prezzo_prodotto=self.lista_prezzi_manager.get_selected_object()
        self.GetEventHandler().ProcessEvent(evento)
            
    def update_fields(self,obj):
        print self.__class__.__name__,'.update_fields'
        self.ID.set_value(obj.get_ID_fmt())
        self.barcode.set_value(obj.get_barcode())
        self.categoria.set_value(obj.categoria)
        self._fill_sottocategorie(None)
        self.sottocategoria.set_value(obj.sottocategoria)
        self.descrizione.set_value(obj.descrizione)
        self.con_magazzino.SetValue(obj.has_magazzino())
        self.lista_prezzi_manager.load(obj.get_info_prezzi())
        self.lista_fornitori_manager.load(obj.get_info_fornitori())
    
    def reset_fields(self):
        print self.__class__.__name__,'.reset_fields'
        self.ID.clear()
        self.barcode.clear()
        self.descrizione.clear()
        self.lista_prezzi_manager.clear()
        self.lista_fornitori_manager.clear()
    
    def reset_focus(self):
        self.descrizione.set_focus()
        
    def update_object(self,obj):
        print self.__class__.__name__,'update_object'
        obj.set_ID(self.ID.get_value())
        obj.barcode = self.barcode.get_value()
        obj.descrizione=self.descrizione.get_value()
        obj.set_categoria(self.categoria.get_selected_object())
        obj.set_sottocategoria(self.sottocategoria.get_selected_object())
        obj.con_magazzino=self.con_magazzino.GetValue()        

